package server

import (
	"context"

	"github.com/go-kratos/kratos/v2/middleware/auth/jwt"
	"github.com/go-kratos/kratos/v2/middleware/selector"
	jwt2 "github.com/golang-jwt/jwt/v5"

	"gitee.com/architect-training/substitute-driver/customer-srv/api/customer"
	v1 "gitee.com/architect-training/substitute-driver/customer-srv/api/helloworld/v1"
	"gitee.com/architect-training/substitute-driver/customer-srv/internal/biz"
	"gitee.com/architect-training/substitute-driver/customer-srv/internal/conf"
	"gitee.com/architect-training/substitute-driver/customer-srv/internal/service"

	"github.com/go-kratos/kratos/v2/log"
	"github.com/go-kratos/kratos/v2/middleware/recovery"
	"github.com/go-kratos/kratos/v2/transport/http"
)

// NewHTTPServer new an HTTP server.
func NewHTTPServer(c *conf.Server, customerSrv *service.CustomerService, greeter *service.GreeterService, logger log.Logger) *http.Server {
	var opts = []http.ServerOption{
		http.Middleware(
			recovery.Recovery(),
			// CORS，全部的请求（响应）都使用该中间件
			selector.Server(MWCors()).Match(func(ctx context.Context, operation string) bool {
				return true
			}).Build(),
			// JWT，除了特定几个，其他请求（响应）都是用该中间件
			selector.Server(
				jwt.Server(func(token *jwt2.Token) (any, error) {
					return []byte(biz.CustomerSecret), nil
				}),
				customerJWT(customerSrv),
			).Match(func(ctx context.Context, operation string) bool {
				// 根据需要完成是否启用该中间件
				noAuth := map[string]bool{
					"/api.customer.Customer/GetVeriCode": true,
					"/api.customer.Customer/Login":       true,
				}
				if noAuth[operation] {
					return false
				}
				return true
			}).Build(),
		),
	}
	if c.Http.Network != "" {
		opts = append(opts, http.Network(c.Http.Network))
	}
	if c.Http.Addr != "" {
		opts = append(opts, http.Address(c.Http.Addr))
	}
	if c.Http.Timeout != nil {
		opts = append(opts, http.Timeout(c.Http.Timeout.AsDuration()))
	}
	srv := http.NewServer(opts...)
	v1.RegisterGreeterHTTPServer(srv, greeter)
	customer.RegisterCustomerHTTPServer(srv, customerSrv)
	return srv
}
